package com.myblog.manage.service.impl;

import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.myblog.common.annotation.Log;
import com.myblog.common.utils.DateUtils;
import com.myblog.manage.domain.Category;
import com.myblog.manage.domain.Tag;
import com.myblog.manage.domain.dto.ArticleTagDTO;
import com.myblog.manage.domain.vo.ArticleVo;
import com.myblog.manage.mapper.CategoryMapper;
import com.myblog.manage.mapper.TagMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.myblog.manage.mapper.ArticleMapper;
import com.myblog.manage.domain.Article;
import com.myblog.manage.service.IArticleService;
import org.springframework.transaction.annotation.Transactional;

/**
 * 文章管理Service业务层处理
 * 
 * @author mingo_sheep
 * @date 2025-05-05
 */
@Service
public class ArticleServiceImpl implements IArticleService 
{
    @Autowired
    private ArticleMapper articleMapper;

    @Autowired
    private CategoryMapper categoryMapper;

    @Autowired
    private TagMapper tagMapper;

    /**
     * 查询文章管理
     * 
     * @param id 文章管理主键
     * @return 文章管理
     */
    @Override
    public Article selectArticleById(Long id)
    {
        return articleMapper.selectArticleById(id);
    }

    /**
     * 查询文章管理列表
     * 
     * @param article 文章管理
     * @return 文章管理
     */
    @Override
    public List<Article> selectArticleList(Article article)
    {
        return articleMapper.selectArticleList(article);
    }

    @Override
    public List<ArticleVo> selectArticleVoList(Map<String, Object> params) {
        List<ArticleVo> articles = articleMapper.selectArticleVoList(params);

        if (!articles.isEmpty()) {
            List<Long> articleIds = articles.stream()
                    .map(ArticleVo::getId)
                    .collect(Collectors.toList());

            List<ArticleTagDTO> tags = articleMapper.selectTagsByArticleIds(articleIds);


            Map<Long, List<ArticleTagDTO>> tagMap = tags.stream()
                    .collect(Collectors.groupingBy(ArticleTagDTO::getArticleId));

            for (ArticleVo article : articles) {
                List<Tag> convertedTags = tagMap.getOrDefault(article.getId(), Collections.emptyList()).stream()
                        .map(dto -> {
                            Tag tag = new Tag();
                            tag.setId(dto.getId());
                            tag.setName(dto.getName());
                            return tag;
                        })
                        .collect(Collectors.toList());

                article.setTagList(convertedTags);
            }
        }

        return articles;
    }

    @Override
    public List<Category> listAllCategories() {
        return categoryMapper.selectAllCategories();
    }

    @Override
    public List<Tag> listAllTags() {
        return tagMapper.selectAllTags();
    }


    /**
     * 新增文章管理
     * 
     * @param article 文章管理
     * @return 结果
     */
    @Transactional
    @Override
    @Log
    public int insertArticle(Article article, Long categoryId, List<Long> tagIds)
    {
        // 设置创建时间
        article.setCreateTime(DateUtils.getNowDate());

        // 插入文章基本信息
        int result = articleMapper.insertArticle(article);


        if (result > 0) {
            Long articleId = article.getId(); // 获取刚插入的文章ID

            // 插入分类（假设每个文章只能属于一个分类）
            if (categoryId != null) {
                categoryMapper.insertArticleCategory(articleId, categoryId);
            }

            // 插入标签（多对多关系）
            if (tagIds != null && !tagIds.isEmpty()) {
                tagMapper.insertArticleTags(articleId, tagIds);
            }
        }

        return result;
    }

    /**
     * 修改文章管理
     * 
     * @param article 文章管理
     * @return 结果
     */
    @Override
    public int updateArticle(Article article)
    {
        article.setUpdateTime(DateUtils.getNowDate());
        return articleMapper.updateArticle(article);
    }

    /**
     * 批量删除文章管理
     * 
     * @param ids 需要删除的文章管理主键
     * @return 结果
     */
    @Override
    public int deleteArticleByIds(Long[] ids)
    {
        return articleMapper.deleteArticleByIds(ids);
    }

    /**
     * 删除文章管理信息
     * 
     * @param id 文章管理主键
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteArticleById(Long id)
    {
        // 先删除关联表数据
        articleMapper.deleteArticleCategoryByArticleId(id); // 删除 tb_article_category 中关联记录
        articleMapper.deleteArticleTagsByArticleId(id);
        // 删除 tb_article_tag 中关联记录
        return articleMapper.deleteArticleById(id);
    }
}
